home *** CD-ROM | disk | FTP | other *** search
/ Hobby PC 13 / Hobby PC 13.iso / assets / Asset Library / Forms / ryanvalid.js < prev    next >
Text File  |  2001-04-09  |  27KB  |  821 lines

  1. var defaultEmptyOK = false;
  2.  
  3. //set up basic character groups
  4. var digits = "0123456789";
  5. var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
  6. var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  7. var whitespace = " \t\n\r";
  8. var nameDelimiters = "-. ";
  9. var decimalPointDelimiter = ".";
  10.  
  11. //set up allowed characters for specific data types
  12.  
  13. //phone numbers
  14. var phoneNumberDelimiters = "()- ";
  15. var digitsInUSPhoneNumber = 10;
  16. var validUSPhoneChars = digits + phoneNumberDelimiters;
  17. var validWorldPhoneChars = digits + phoneNumberDelimiters + "+";
  18.  
  19. //electronic addresses
  20. var validDomainNameChars = digits + uppercaseLetters + lowercaseLetters + "-_.";
  21.  
  22.  
  23. //snail mail addresses
  24. var addressDelimiters = ".,/-" + whitespace;
  25. var validAddressCharacters = addressDelimiters + digits + uppercaseLetters + lowercaseLetters;
  26.  
  27. //US mail address parameters
  28. var digitsInZIPCode1 = 5;
  29. var digitsInZIPCode2 = 9;
  30. var ZIPCodeDelimiters = "-";
  31. var ZIPCodeDelimeter = "-";
  32. var validZIPCodeChars = digits + ZIPCodeDelimiters;
  33. var USStateCodes = "AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|AE|AA|AE|AE|AP";
  34. var USStateCodeDelimiter = "|";
  35.  
  36. //Canadian mail address parameters
  37. var cdnProvCodes = "BC|AB|SK|MB|ON|QC|NF|PE|NS|NB|NT|YT|NU";
  38. var postalCodeDelimiter = " ";
  39. var validPostalCodeChars = digits + lowercaseLetters + uppercaseLetters + postalCodeDelimiter;
  40. var charsInPostalCode = 6;
  41. var cdnProvCodeDelimiter = "|";
  42.  
  43. //credit card parameters
  44. var creditCardDelimiters = " ";
  45. var daysInMonth = makeArrayFromString(31,29,31,30,31,30,31,31,30,31,30,31);
  46.  
  47. function makeArray(n) {
  48.    for (var i = 1; i <= n; i++) {
  49.       this[i] = 0;
  50.    } 
  51.    this[length] = n;
  52.    return this;
  53. }
  54.  
  55. function makeArrayFromString() {
  56.    for (var i = 1; i <= makeArrayFromString.arguments.length; i++){
  57.       this[i] = makeArrayFromString.arguments[i];
  58.    }
  59.    this[length] = makeArrayFromString.arguments.length;
  60.    return this;
  61. }
  62.  
  63. function isEmpty(s) {
  64.     return ((s == null) || (s.length == 0))
  65. }
  66.  
  67. function isWhitespace(s) {
  68.     var i;
  69.  
  70.     if (isEmpty(s)) return true;
  71.     for (i = 0; i < s.length; i++)
  72.     {   
  73.         var c = s.charAt(i);
  74.         if (whitespace.indexOf(c) == -1) return false; // not whitespace
  75.     }
  76.     return true;
  77. }
  78.  
  79. function stripCharsInBag (s, bag){
  80.     var i;
  81.     var returnString = "";
  82.     for (i = 0; i < s.length; i++)
  83.     {   
  84.         // Check that current character isn't whitespace.
  85.         var c = s.charAt(i);
  86.         if (bag.indexOf(c) == -1) returnString += c;
  87.     }
  88.     return returnString;
  89. }
  90.  
  91. function stripCharsNotInBag (s, bag){
  92.     var i;
  93.     var returnString = "";
  94.     for (i = 0; i < s.length; i++)
  95.     {   
  96.         var c = s.charAt(i);
  97.         if (bag.indexOf(c) != -1) returnString += c;
  98.     }
  99.     return returnString;
  100. }
  101.  
  102. function stripWhitespace (s){
  103.    return stripCharsInBag (s, whitespace)
  104. }
  105.  
  106. function charInString (c, s){
  107.     for (i = 0; i < s.length; i++){
  108.        if (s.charAt(i) == c) return true;
  109.     }
  110.     return false
  111. }
  112.  
  113. function stripInitialWhitespace (s){
  114.     var i = 0;
  115.     while ((i < s.length) && charInString (s.charAt(i), whitespace))
  116.        i++;
  117.     return s.substring (i, s.length);
  118. }
  119.  
  120. function isLetter (c){
  121.    return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
  122. }
  123.  
  124. function isDigit (c){
  125.    return ((c >= "0") && (c <= "9"))
  126. }
  127.  
  128. function isLetterOrDigit (c){
  129.    return (isLetter(c) || isDigit(c))
  130. }
  131.  
  132. function isInteger (s){
  133.     var i;
  134.     if (isEmpty(s)) 
  135.        if (isInteger.arguments.length == 1) return defaultEmptyOK;
  136.        else return (isInteger.arguments[1] == true);
  137.     for (i = 0; i < s.length; i++)
  138.     {   
  139.         var c = s.charAt(i);
  140.         if (!isDigit(c)) return false;
  141.     }
  142.     return true;
  143. }
  144.  
  145. function isSignedInteger (s){
  146.    if (isEmpty(s)) 
  147.        if (isSignedInteger.arguments.length == 1) return defaultEmptyOK;
  148.        else return (isSignedInteger.arguments[1] == true);
  149.     else {
  150.         var startPos = 0;
  151.         var secondArg = defaultEmptyOK;
  152.         if (isSignedInteger.arguments.length > 1)
  153.             secondArg = isSignedInteger.arguments[1];
  154.         if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
  155.            startPos = 1;    
  156.         return (isInteger(s.substring(startPos, s.length), secondArg))
  157.     }
  158. }
  159.  
  160. function isPositiveInteger (s){
  161.     var secondArg = defaultEmptyOK;
  162.     if (isPositiveInteger.arguments.length > 1)
  163.         secondArg = isPositiveInteger.arguments[1];
  164.     return (isSignedInteger(s, secondArg)
  165.          && ( (isEmpty(s) && secondArg)  || (parseInt (s) > 0) ) );
  166. }
  167.  
  168. function isNonnegativeInteger (s){
  169.     var secondArg = defaultEmptyOK;
  170.     if (isNonnegativeInteger.arguments.length > 1)
  171.         secondArg = isNonnegativeInteger.arguments[1];
  172.     return (isSignedInteger(s, secondArg)
  173.          && ( (isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );
  174. }
  175.  
  176. function isNegativeInteger (s){
  177.     var secondArg = defaultEmptyOK;
  178.     if (isNegativeInteger.arguments.length > 1)
  179.         secondArg = isNegativeInteger.arguments[1];
  180.     return (isSignedInteger(s, secondArg)
  181.          && ( (isEmpty(s) && secondArg)  || (parseInt (s) < 0) ) );
  182. }
  183.  
  184. function isNonpositiveInteger (s){
  185.     var secondArg = defaultEmptyOK;
  186.     if (isNonpositiveInteger.arguments.length > 1)
  187.         secondArg = isNonpositiveInteger.arguments[1];
  188.     return (isSignedInteger(s, secondArg)
  189.          && ( (isEmpty(s) && secondArg)  || (parseInt (s) <= 0) ) );
  190. }
  191.  
  192. function isFloat (s){
  193.     var i;
  194.     var seenDecimalPoint = false;
  195.     if (isEmpty(s)) 
  196.        if (isFloat.arguments.length == 1) return defaultEmptyOK;
  197.        else return (isFloat.arguments[1] == true);
  198.     if (s == decimalPointDelimiter) return false;
  199.     for (i = 0; i < s.length; i++)
  200.     {   
  201.         var c = s.charAt(i);
  202.         if ((c == decimalPointDelimiter) && !seenDecimalPoint) seenDecimalPoint = true;
  203.         else if (!isDigit(c)) return false;
  204.     }
  205.     return true;
  206. }
  207.  
  208. function isSignedFloat (s){
  209.     if (isEmpty(s)) 
  210.        if (isSignedFloat.arguments.length == 1) return defaultEmptyOK;
  211.        else return (isSignedFloat.arguments[1] == true);
  212.     else {
  213.         var startPos = 0;
  214.         var secondArg = defaultEmptyOK;
  215.         if (isSignedFloat.arguments.length > 1)
  216.             secondArg = isSignedFloat.arguments[1];
  217.         if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
  218.            startPos = 1;    
  219.         return (isFloat(s.substring(startPos, s.length), secondArg))
  220.     }
  221. }
  222.  
  223. function isAlphabetic (s){
  224.     var i;
  225.     if (isEmpty(s)) 
  226.        if (isAlphabetic.arguments.length == 1) return defaultEmptyOK;
  227.        else return (isAlphabetic.arguments[1] == true);
  228.     for (i = 0; i < s.length; i++)
  229.     {   
  230.         var c = s.charAt(i);
  231.         if (!isLetter(c))
  232.         return false;
  233.     }
  234.     return true;
  235. }
  236.  
  237. function isAlphanumeric (s){
  238.     var i;
  239.     if (isEmpty(s)) 
  240.        if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
  241.        else return (isAlphanumeric.arguments[1] == true);
  242.     for (i = 0; i < s.length; i++)
  243.     {   
  244.         var c = s.charAt(i);
  245.         if (! (isLetter(c) || isDigit(c) ) )
  246.         return false;
  247.     }
  248.     return true;
  249. }
  250.  
  251. function reformat (s){
  252.     var arg;
  253.     var sPos = 0;
  254.     var resultString = "";
  255.     for (var i = 1; i < reformat.arguments.length; i++) {
  256.        arg = reformat.arguments[i];
  257.        if (i % 2 == 1) resultString += arg;
  258.        else {
  259.            resultString += s.substring(sPos, sPos + arg);
  260.            sPos += arg;
  261.        }
  262.     }
  263.     return resultString;
  264. }
  265.  
  266. function reformatWebURL(s) {
  267.   if (isEmpty(s)) 
  268.      if (reformatWebURL.arguments.length == 1) return defaultEmptyOK;
  269.      else return (reformatWebURL.arguments[1] == true);
  270.   return ("http://"+s);
  271. }
  272.  
  273. function makeTitleCase(s){
  274.   if (isEmpty(s)) 
  275.      if (makeTitleCase.arguments.length == 1) return defaultEmptyOK;
  276.      else return (makeTitleCase.arguments[1] == true);
  277.   count = 1;
  278.   ws = 0;
  279.   s = s.charAt(0).toUpperCase()+s.substring(1,s.length);
  280.   while (count < s.length){
  281.     if (isWhitespace(s.charAt(count)) || (s.charAt(count) == ".") || (s.charAt(count) == "-")) ws = 1;
  282.     else if ((ws == 1) && (isLetter(s.charAt(count)))){
  283.       s = s.substring(0,count)+s.charAt(count).toUpperCase()+s.substring(count+1,s.length);
  284.       ws = 0;
  285.     }
  286.     count++;
  287.   }
  288.   return s;
  289. }
  290.  
  291. function isUSPhoneNumber (s){
  292.     if (isEmpty(s)) 
  293.        if (isUSPhoneNumber.arguments.length == 1) return defaultEmptyOK;
  294.        else return (isUSPhoneNumber.arguments[1] == true);
  295.     return (isInteger(s) && s.length == digitsInUSPhoneNumber)
  296. }
  297.  
  298. function isInternationalPhoneNumber (s){
  299.     if (isEmpty(s)) {
  300.        if (isInternationalPhoneNumber.arguments.length == 1) return defaultEmptyOK;
  301.        else return (isInternationalPhoneNumber.arguments[1] == true);
  302.     }
  303.     return isPositiveInteger(s);
  304. }
  305.  
  306. function isZIPCode (s){
  307.    if (isEmpty(s)) 
  308.        if (isZIPCode.arguments.length == 1) return defaultEmptyOK;
  309.        else return (isZIPCode.arguments[1] == true);
  310.    return (isInteger(s) && 
  311.             ((s.length == digitsInZIPCode1) ||
  312.              (s.length == digitsInZIPCode2)))
  313. }
  314.  
  315. function isPostalCode (s){
  316.    if (isEmpty(s)){
  317.        if (isPostalCode.arguments.length == 1) return defaultEmptyOK;
  318.        else return (isPostalCode.arguments[1] == true);
  319.    }
  320.    if (!isAlphanumeric(s)) return false;
  321.    if (s.length == charsInPostalCode){
  322.      var count = 0;
  323.      var status = "";
  324.      while (count < s.length){
  325.        if ((parseFloat(count%2)) == 0) status = isLetter(s.charAt(count));
  326.        else status = isDigit(s.charAt(count));     
  327.        if (status == false) return status
  328.        count++;
  329.      }
  330.    return status;
  331.    }
  332.    else return false;
  333. }
  334.  
  335. function isStateCode(s){
  336.     if (isEmpty(s)) 
  337.        if (isStateCode.arguments.length == 1) return defaultEmptyOK;
  338.        else return (isStateCode.arguments[1] == true);
  339.     return ( (USStateCodes.indexOf(s) != -1) &&
  340.              (s.indexOf(USStateCodeDelimiter) == -1) )
  341. }
  342.  
  343. function isProvinceCode(s) {
  344.     if (isEmpty(s))
  345.         if (isProvinceCode.arguments.length == 1) return defaultEmptyOK;
  346.         else return (isProvinceCode.arguments[1] == true);
  347.     return( (cdnProvCodes.indexOf(s) != -1) &&
  348.             (s.indexOf(cdnProvCodeDelimiter) == -1)  )
  349. }
  350.  
  351. function isEmail (s){
  352.     if (isEmpty(s)) 
  353.        if (isEmail.arguments.length == 1) return defaultEmptyOK;
  354.        else return (isEmail.arguments[1] == true);
  355.     if (isWhitespace(s)) return false;
  356.     var i = 1;
  357.     var sLength = s.length;
  358.     while ((i < sLength) && (s.charAt(i) != "@"))
  359.     { i++ }
  360.     if ((i >= sLength) || (s.charAt(i) != "@")) return ("no @ sign");
  361.     else atloc = i;
  362.     j = i+1;
  363.     i += 1;
  364.     while ((j < sLength) && (validDomainNameChars.indexOf(s.charAt(j)) != -1))
  365.     { j++ }
  366.     if (j < sLength) return("invalid character in domain name: "+s.charAt(j));
  367.     while ((i < sLength) && (s.charAt(i) != "."))
  368.     { i++ }
  369.     if (i == sLength) return("no . in domain name");
  370.     if (i == (atloc +1)) return("not enough space between @ and .");
  371.     k = atloc+1;
  372.     while (k < sLength){
  373.       if ((s.charAt(k) == ".") && (s.charAt(k+1) == ".")) return("too many .'s");
  374.       k++
  375.     }
  376.     l = sLength;
  377.     while ((i < sLength -2) && (l != i) && (s.charAt(l) != "."))
  378.     { l = l-1 }
  379.     if ((i >= sLength - 2) || (s.charAt(i) != ".") || (l >= sLength - 2)) return("not enough chars after .");
  380.     else return true;
  381. }
  382.  
  383. function isURL (s)
  384. {   if (isEmpty(s)) 
  385.        if (isURL.arguments.length == 1) return defaultEmptyOK;
  386.        else return (isURL.arguments[1] == true);
  387.     if (isWhitespace(s)) return false;
  388.     var i = 0;
  389.     var j = 0;
  390.     var URLstart = 0;
  391.     var sLength = s.length;
  392.     while ((j < sLength) && (validDomainNameChars.indexOf(s.charAt(j)) != -1))
  393.     { j++ }
  394.     if (j < sLength) return("invalid character in domain name: "+s.charAt(j));
  395.     while ((i < sLength) && (s.charAt(i) != "."))
  396.     { i++ }
  397.     if (i == sLength) return("no . in domain name");
  398.     if (i == (URLstart)) return("not enough space before first .");
  399.     k = URLstart+1;
  400.     while (k < sLength)
  401.     {
  402.       if ((s.charAt(k) == ".") && (s.charAt(k+1) == ".")) return("too many .'s");
  403.       k++
  404.     }
  405.     l = sLength;
  406.     while ((i < sLength -2) && (l != i) && (s.charAt(l) != "."))
  407.     { l = l-1 }
  408.     if ((i >= sLength - 2) || (s.charAt(i) != ".") || (l >= sLength - 2)) return("not enough chars after .");
  409.     else return true;
  410. }
  411.  
  412. function isYear (s){
  413.     if (isEmpty(s)) 
  414.        if (isYear.arguments.length == 1) return defaultEmptyOK;
  415.        else return (isYear.arguments[1] == true);
  416.     if (!isNonnegativeInteger(s)) return false;
  417.     else return ((s.length == 4) || (s.length == 2));
  418. }
  419.  
  420. function isIntegerInRange (s, a, b){
  421.     if (isEmpty(s)) 
  422.        if (isIntegerInRange.arguments.length == 1) return defaultEmptyOK;
  423.        else return (isIntegerInRange.arguments[1] == true);
  424.     if (!isInteger(s, false)) return false;
  425.     var num = parseInt (s);
  426.     return ((num >= a) && (num <= b));
  427. }
  428.  
  429. function isMonth (s){
  430.     if (isEmpty(s)) 
  431.        if (isMonth.arguments.length == 1) return defaultEmptyOK;
  432.        else return (isMonth.arguments[1] == true);
  433.     return isIntegerInRange (s, 1, 12);
  434. }
  435.  
  436. function isDay (s){
  437.     if (isEmpty(s)) 
  438.        if (isDay.arguments.length == 1) return defaultEmptyOK;
  439.        else return (isDay.arguments[1] == true);   
  440.     return isIntegerInRange (s, 1, 31);
  441. }
  442.  
  443. function daysInFebruary (year){
  444.     return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
  445. }
  446.  
  447. function isDate (year, month, day){ 
  448.     if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;
  449.     var intYear = parseInt(year);
  450.     var intMonth = parseInt(month);
  451.     var intDay = parseInt(day);
  452.     if (intDay > daysInMonth[intMonth]) return false; 
  453.     if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;
  454.     return true;
  455. }
  456.  
  457. function prompt (s){
  458.     window.status = s
  459. }
  460.  
  461. function warnInvalid (theField,s){
  462. //    theField.focus()
  463.     theField.select()
  464.     alert(s)
  465.     return false
  466. }
  467.  
  468. function checkString (theField, s, emptyOK){
  469.     if (checkString.arguments.length == 2) emptyOK = defaultEmptyOK;
  470.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  471.     if (isWhitespace(theField.value)) 
  472.        return warnEmpty (theField, s);
  473.     else return true;
  474. }
  475.  
  476. function checkStateCode (theField, emptyOK){
  477.     if (checkStateCode.arguments.length == 1) emptyOK = defaultEmptyOK;
  478.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  479.     else
  480.     {  theField.value = theField.value.toUpperCase();
  481.        if (!isStateCode(theField.value, false)) 
  482.           return warnInvalid (theField, "Invalid State Code");
  483.        else return true;
  484.     }
  485. }
  486.  
  487. function checkProvinceCode (theField, emptyOK)
  488. {   if (checkProvinceCode.arguments.length == 1) emptyOK = defaultEmptyOK;
  489.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  490.     else
  491.     {  theField.value = theField.value.toUpperCase();
  492.        if (!isProvinceCode(theField.value, false)) 
  493.           return warnInvalid (theField, "Invalid Province Code");
  494.        else return true;
  495.     }
  496. }
  497.  
  498. function reformatZIPCode (ZIPString){
  499.     if (ZIPString.length == 5) return ZIPString;
  500.     else return (reformat (ZIPString, "", 5, "-", 4));
  501. }
  502.  
  503. function checkZIPCode (theField, emptyOK){
  504.     if (checkZIPCode.arguments.length == 1) emptyOK = defaultEmptyOK;
  505.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  506.     else
  507.     { var normalizedZIP = stripCharsInBag(theField.value, ZIPCodeDelimiters)
  508.       if (!isZIPCode(normalizedZIP, false)) 
  509.          return warnInvalid (theField, "Invalid Zip Code");
  510.       else 
  511.       {
  512.          theField.value = reformatZIPCode(normalizedZIP)
  513.          return true;
  514.       }
  515.     }
  516. }
  517.  
  518. function checkPostalCode (theField, emptyOK){
  519.     if (checkPostalCode.arguments.length == 1) emptyOK = defaultEmptyOK;
  520.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  521.     else{
  522.       var normalizedPostalCode = stripCharsInBag(theField.value, postalCodeDelimiter)
  523.       if (!isPostalCode(normalizedPostalCode, false)) 
  524.          return warnInvalid (theField, "Invalid Postal Code");
  525.       else {
  526.          theField.value = theField.value.toUpperCase();
  527.          theField.value = reformat(stripCharsInBag(theField.value,postalCodeDelimiter),"",3,postalCodeDelimiter,3);
  528.          return true;
  529.       }
  530.     }
  531. }
  532.  
  533. function reformatUSPhone (USPhone)
  534. {   return (reformat (USPhone, "(", 3, ") ", 3, "-", 4))
  535. }
  536.  
  537. function checkUSPhone (theField, emptyOK)
  538. {   if (checkUSPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
  539.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  540.     else
  541.     {  var normalizedPhone = stripCharsInBag(theField.value, phoneNumberDelimiters)
  542.        if (!isUSPhoneNumber(normalizedPhone, false)) 
  543.           return warnInvalid (theField, "Invalid NA Phone Number");
  544.        else 
  545.        {
  546.           theField.value = reformatUSPhone(normalizedPhone)
  547.           return true;
  548.        }
  549.     }
  550. }
  551.  
  552. function checkInternationalPhone (theField, emptyOK)
  553. {   if (checkInternationalPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
  554.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  555.     else
  556.     {  if (!isInternationalPhoneNumber(stripCharsInBag(theField.value,phoneNumberDelimiters))) {
  557.           return warnInvalid (theField, "Invalid International Phone");
  558.        }
  559.        else return true;
  560.     }
  561. }
  562.  
  563. function checkEmail (theField, emptyOK){
  564.     if (checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK;
  565.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  566.     else {
  567.       emailStatus = isEmail(theField.value, false)
  568.       if (emailStatus != true) return warnInvalid (theField, emailStatus);
  569.       else return true;
  570.     }
  571. }
  572.  
  573. function checkName(theField,emptyOK){
  574.     if (checkName.arguments.length == 1) emptyOK = defaultEmptyOK;
  575.     if (isEmpty(theField.value)) return emptyOK;
  576.     else {
  577.         if (!isAlphabetic(stripCharsInBag(theField.value,nameDelimiters))){
  578.           warnInvalid(theField,theField.name+" contains invalid characters");
  579.           return false;
  580.         }
  581.         else {
  582.           theField.value = makeTitleCase(theField.value);
  583.           return true;
  584.         }
  585.     }
  586. }
  587.  
  588. function checkAddress(theField, emptyOK){
  589.     if (checkAddress.arguments.length == 1) emptyOK = defaultEmptyOK;
  590.     if (isEmpty(theField.value)) return emptyOK;
  591.     else {
  592.       if (!isEmpty(stripCharsInBag(theField.value,validAddressCharacters))) return warnInvalid(theField,theField.name+ " contains invalid characters");
  593.       else {
  594.         theField.value = makeTitleCase(theField.value);
  595.         return true
  596.       }
  597.     }
  598. }
  599. function checkURL (theField, emptyOK){
  600.     if (checkURL.arguments.length == 1) emptyOK = defaultEmptyOK;
  601.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  602.     else {
  603.       var tempURL = theField.value;
  604.       if ((tempURL.indexOf("http://") >= 0) && (tempURL.indexOf("http://") < tempURL.length)) theField.value = tempURL.substring(tempURL.indexOf("http://")+7,tempURL.length);
  605.       URLStatus = isURL(theField.value, false)
  606.       if (URLStatus != true) return warnInvalid (theField, URLStatus);
  607.       else {
  608.         theField.value = reformatWebURL(theField.value);
  609.         return true;
  610.       }
  611.     }
  612. }
  613.  
  614. function checkYear (theField, emptyOK){
  615.     if (checkYear.arguments.length == 1) emptyOK = defaultEmptyOK;
  616.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  617.     if (!isYear(theField.value, false)) 
  618.        return warnInvalid (theField, "Invalid Year");
  619.     else {
  620.     if (theField.value.length == 2) theField.value = (parseInt(theField.value)+1900);
  621.     return true;
  622.     }
  623. }
  624.  
  625. function checkMonth (theField, emptyOK){
  626.     if (checkMonth.arguments.length == 1) emptyOK = defaultEmptyOK;
  627.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  628.     if (!isMonth(theField.value, false)) 
  629.        return warnInvalid (theField, "Invalid Month");
  630.     else return true;
  631. }
  632.  
  633. function checkDay (theField, emptyOK){
  634.     if (checkDay.arguments.length == 1) emptyOK = defaultEmptyOK;
  635.     if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  636.     if (!isDay(theField.value, false)) 
  637.        return warnInvalid (theField, "Invalid Day");
  638.     else return true;
  639. }
  640.  
  641. function checkDate (yearField, monthField, dayField, labelString, OKtoOmitDay){
  642.     if (checkDate.arguments.length == 4) OKtoOmitDay = false;
  643.     if (!isYear(yearField.value)) return warnInvalid (yearField, "Invalid Year");
  644.     else if (yearField.value.length == 2) yearField.value = (parseInt(yearField.value)+1900);
  645.     if (!isMonth(monthField.value)) return warnInvalid (monthField, "Invalid Month");
  646.     if ( (OKtoOmitDay == true) && isEmpty(dayField.value) ) return true;
  647.     else if (!isDay(dayField.value)) 
  648.        return warnInvalid (dayField, "Invalid Day");
  649.     if (isDate (yearField.value, monthField.value, dayField.value))
  650.        return true;
  651.     alert ("The " + labelString + " is invalid" )
  652.     return false
  653. }
  654.  
  655. function checkMDY(theField,emptyOK){
  656.     if (checkMDY.arguments.length == 1) emptyOK = defaultEmptyOK;
  657.     if (isEmpty(theField.value)) return emptyOK;
  658.     else{
  659.       var dateString = stripCharsInBag(theField.value,"-/ ");
  660.       var mm = dateString.substring(0,2);
  661.       var dd = dateString.substring(2,4);
  662.       var yyyy = dateString.substring(4,theField.value.length);
  663.       if (!isMonth(mm)) return warnInvalid(theField,theField.name + " contains an invalid month. Format must be MM/DD/YYYY.");
  664.       if (!isDay(dd)) return warnInvalid(theField,theField.name + " contains an invalid day. Format must be MM/DD/YYYY.");
  665.       if (!isYear(yyyy)) return warnInvalid(theField,theField.name + " contains an invalid year. Format must be MM/DD/YYYY.");
  666.       else if (yyyy.length == 2) yyyy = (parseInt(yyyy)+1900);
  667.       if (isDate(yyyy.toString(),mm.toString(),dd.toString())){
  668.         theField.value = mm+"/"+dd+"/"+yyyy;
  669.         return true;
  670.       }
  671.       else{
  672.         warnInvalid(theField,theField.name + " contains an invalid date");
  673.         return false;
  674.       }
  675.     }
  676. }
  677.  
  678. function getRadioButtonValue (radio){
  679.     for (var i = 0; i < radio.length; i++)
  680.     {   if (radio[i].checked) { break }
  681.     }
  682.     return radio[i].value
  683. }
  684.  
  685. function checkCreditCard (radio, theField){
  686.     var cardType = getRadioButtonValue (radio)
  687.     var normalizedCCN = stripCharsInBag(theField.value, creditCardDelimiters)
  688.     if (!isCardMatch(cardType, normalizedCCN)) 
  689.        return warnInvalid (theField, "Not a valid " + cardType + " Number");
  690.     else 
  691.     {  theField.value = normalizedCCN
  692.        return true
  693.     }
  694. }
  695.  
  696.  
  697. function isCreditCard(st) {
  698.   if (st.length > 19)
  699.     return (false);
  700.   sum = 0; mul = 1; l = st.length;
  701.   for (i = 0; i < l; i++) {
  702.     digit = st.substring(l-i-1,l-i);
  703.     tproduct = parseInt(digit ,10)*mul;
  704.     if (tproduct >= 10)
  705.       sum += (tproduct % 10) + 1;
  706.     else
  707.       sum += tproduct;
  708.     if (mul == 1)
  709.       mul++;
  710.     else
  711.       mul--;
  712.   }
  713.   if ((sum % 10) == 0)
  714.     return (true);
  715.   else
  716.     return (false);
  717. }
  718.  
  719. function isVisa(cc){
  720.   if (((cc.length == 16) || (cc.length == 13)) &&
  721.       (cc.substring(0,1) == 4))
  722.     return isCreditCard(cc);
  723.   return false;
  724. }
  725.  
  726. function isMasterCard(cc){
  727.   firstdig = cc.substring(0,1);
  728.   seconddig = cc.substring(1,2);
  729.   if ((cc.length == 16) && (firstdig == 5) &&
  730.       ((seconddig >= 1) && (seconddig <= 5)))
  731.     return isCreditCard(cc);
  732.   return false;
  733.  
  734. }
  735.  
  736. function isAmericanExpress(cc){
  737.   firstdig = cc.substring(0,1);
  738.   seconddig = cc.substring(1,2);
  739.   if ((cc.length == 15) && (firstdig == 3) &&
  740.       ((seconddig == 4) || (seconddig == 7)))
  741.     return isCreditCard(cc);
  742.   return false;
  743.  
  744. }
  745.  
  746. function isDinersClub(cc){
  747.   firstdig = cc.substring(0,1);
  748.   seconddig = cc.substring(1,2);
  749.   if ((cc.length == 14) && (firstdig == 3) &&
  750.       ((seconddig == 0) || (seconddig == 6) || (seconddig == 8)))
  751.     return isCreditCard(cc);
  752.   return false;
  753. }
  754.  
  755.  
  756. function isCarteBlanche(cc){
  757.   return isDinersClub(cc);
  758. }
  759.  
  760.  
  761. function isDiscover(cc){
  762.   first4digs = cc.substring(0,4);
  763.   if ((cc.length == 16) && (first4digs == "6011"))
  764.     return isCreditCard(cc);
  765.   return false;
  766.  
  767. }
  768.  
  769. function isEnRoute(cc){
  770.   first4digs = cc.substring(0,4);
  771.   if ((cc.length == 15) &&
  772.       ((first4digs == "2014") ||
  773.        (first4digs == "2149")))
  774.     return isCreditCard(cc);
  775.   return false;
  776. }
  777.  
  778. function isJCB(cc){
  779.   first4digs = cc.substring(0,4);
  780.   if ((cc.length == 16) &&
  781.       ((first4digs == "3088") ||
  782.        (first4digs == "3096") ||
  783.        (first4digs == "3112") ||
  784.        (first4digs == "3158") ||
  785.        (first4digs == "3337") ||
  786.        (first4digs == "3528")))
  787.     return isCreditCard(cc);
  788.   return false;
  789. }
  790.  
  791. function isAnyCard(cc){
  792.   if (!isCreditCard(cc))
  793.     return false;
  794.   if (!isMasterCard(cc) && !isVisa(cc) && !isAmericanExpress(cc) && !isDinersClub(cc) &&
  795.       !isDiscover(cc) && !isEnRoute(cc) && !isJCB(cc)) {
  796.     return false;
  797.   }
  798.   return true;
  799. }
  800.  
  801. function isCardMatch (cardType, cardNumber){
  802.     cardType = cardType.toUpperCase();
  803.     var doesMatch = true;
  804.     if ((cardType == "VISA") && (!isVisa(cardNumber)))
  805.         doesMatch = false;
  806.     if ((cardType == "MASTERCARD") && (!isMasterCard(cardNumber)))
  807.         doesMatch = false;
  808.     if ( ( (cardType == "AMERICANEXPRESS") || (cardType == "AMEX") )
  809.                 && (!isAmericanExpress(cardNumber))) doesMatch = false;
  810.     if ((cardType == "DISCOVER") && (!isDiscover(cardNumber)))
  811.         doesMatch = false;
  812.     if ((cardType == "JCB") && (!isJCB(cardNumber)))
  813.         doesMatch = false;
  814.     if ((cardType == "DINERS") && (!isDinersClub(cardNumber)))
  815.         doesMatch = false;
  816.     if ((cardType == "CARTEBLANCHE") && (!isCarteBlanche(cardNumber)))
  817.         doesMatch = false;
  818.     if ((cardType == "ENROUTE") && (!isEnRoute(cardNumber)))
  819.         doesMatch = false;
  820.     return doesMatch;
  821. }